package creatingPattern.factoryMethod;

/**
 * 抽象产品：提供了产品的接口
 * 设计意图：定义产品的规范，描述产品的主要特性和功能
 * 使用场景：当需要创建一系列相关产品时，抽象产品接口可统一产品行为
 */
interface Product {
    /**
     * 显示产品信息
     * 设计意图：定义产品的展示行为
     * 使用场景：当需要展示产品信息时，调用此方法
     */
    void show();
}

/**
 * 抽象工厂：提供了厂品的生成方法
 * 设计意图：定义创建产品的接口，让子类决定实例化哪个类
 * 使用场景：当需要创建一系列相关产品时，抽象工厂可统一产品创建行为
 */
interface AbstractFactory {
    /**
     * 创建新产品
     * 设计意图：定义产品创建的抽象方法
     * 使用场景：当需要创建具体产品时，调用此方法
     * @return 返回创建的产品
     */
    Product newProduct();
}

/**
 * @Author: Alex Hu
 * Date: 2020/2/22 2:00 下午
 * Content: 工厂方法模式示例
 * 设计意图：通过工厂方法创建不同产品，实现产品创建与使用的分离
 * 使用场景：当需要创建一系列相关产品时，工厂方法模式可统一产品创建行为
 */
public class AbstractFactoryTest {
    /**
     * 主方法：演示工厂方法模式
     * 设计意图：通过XML配置动态创建工厂和产品
     * 使用场景：当需要根据配置创建不同产品时，调用此方法
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        try {
            Product a;
            AbstractFactory af;
            af = (AbstractFactory) ReadXML1.getObject();
            a = af.newProduct();
            a.show();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

/**
 * 具体产品1：实现抽象产品中的抽象方法
 * 设计意图：实现抽象产品接口，提供具体产品行为
 * 使用场景：当需要创建具体产品时，具体产品类可提供具体实现
 */
class ConcreteProduct1 implements Product {
    /**
     * 显示产品信息
     * 设计意图：实现产品的展示行为
     * 使用场景：当需要展示产品信息时，调用此方法
     */
    public void show() {
        System.out.println("具体产品1显示...");
    }
}

/**
 * 具体产品2：实现抽象产品中的抽象方法
 * 设计意图：实现抽象产品接口，提供具体产品行为
 * 使用场景：当需要创建具体产品时，具体产品类可提供具体实现
 */
class ConcreteProduct2 implements Product {
    /**
     * 显示产品信息
     * 设计意图：实现产品的展示行为
     * 使用场景：当需要展示产品信息时，调用此方法
     */
    public void show() {
        System.out.println("具体产品2显示...");
    }
}

/**
 * 具体工厂1：实现了厂品的生成方法
 * 设计意图：实现抽象工厂接口，提供具体产品创建行为
 * 使用场景：当需要创建具体产品时，具体工厂类可提供具体实现
 */
class ConcreteFactory1 implements AbstractFactory {
    /**
     * 创建新产品
     * 设计意图：实现产品创建的抽象方法
     * 使用场景：当需要创建具体产品时，调用此方法
     * @return 返回创建的产品
     */
    public Product newProduct() {
        System.out.println("具体工厂1生成-->具体产品1...");
        return new ConcreteProduct1();
    }
}

/**
 * 具体工厂2：实现了厂品的生成方法
 * 设计意图：实现抽象工厂接口，提供具体产品创建行为
 * 使用场景：当需要创建具体产品时，具体工厂类可提供具体实现
 */
class ConcreteFactory2 implements AbstractFactory {
    /**
     * 创建新产品
     * 设计意图：实现产品创建的抽象方法
     * 使用场景：当需要创建具体产品时，调用此方法
     * @return 返回创建的产品
     */
    public Product newProduct() {
        System.out.println("具体工厂2生成-->具体产品2...");
        return new ConcreteProduct2();
    }
}
